package cn.hcbycloud.common.async.service;

import cn.hcbycloud.common.async.constant.AsyncTaskStatusEnum;
import cn.hcbycloud.common.async.vo.AsyncTaskInfo;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * @author gaoh
 * @desc 异步任务执行管理器
 * @date 2022年02月07日 上午 12:34
 */
@Slf4j
@AllArgsConstructor
public class AsyncTaskManagerService {
    /** 异步任务执行信息容器 */
    private final Map<String, AsyncTaskInfo> taskContainer =
            new HashMap<>(16);

    /**
     * 初始化异步任务
     *
     * @return
     */
    public AsyncTaskInfo initTask() {
        AsyncTaskInfo taskInfo = new AsyncTaskInfo();
        // 设置一个唯一的异步任务 id, 只要唯一即可
        taskInfo.setTaskId(UUID.randomUUID().toString());
        taskInfo.setStatus(AsyncTaskStatusEnum.STARTED);
        taskInfo.setStartTime(LocalDateTime.now());
        // 初始化的时候就要把异步任务执行信息放入到存储容器中
        this.setTaskInfo(taskInfo);
        return taskInfo;
    }

    /**
     * 提交异步任务
     *
     * @return
     */
    public AsyncTaskInfo submit(IAsyncService asyncService) {
        // 初始化一个异步任务的监控信息
        AsyncTaskInfo taskInfo = initTask();
        asyncService.execAsyncTask(taskInfo.getTaskId());
        return taskInfo;
    }

    /**
     * 设置异步任务执行状态信息
     *
     * @param taskInfo
     */
    public void setTaskInfo(AsyncTaskInfo taskInfo) {
        taskContainer.put(taskInfo.getTaskId(),taskInfo);
    }

    /**
     * 获取异步任务执行状态信息
     *
     * @param taskId
     * @return
     */
    public AsyncTaskInfo getTaskInfo(String taskId) {
        return taskContainer.get(taskId);
    }
}